package com.test.factory;

import com.test.exception.BeansException;

/**
 * 扩展了BeanFactory接口，提供了更多高级的Bean管理功能，如自动装配和Bean后处理器支持
 */
public interface AutowireCapableBeanFactory extends BeanFactory{

    // 自动装配模式常量：按类型自动装配
    int AUTOWIRE_BY_TYPE = 1;

    // 自动装配模式常量：按名称自动装配
    int AUTOWIRE_BY_NAME = 2;

    // 自动装配模式常量：通过构造器自动装配
    int AUTOWIRE_CONSTRUCTOR = 3;

    // 自动装配模式常量：不进行自动装配
    int AUTOWIRE_NO = 0;

    /**
     * 创建一个指定类的Bean实例
     *
     * @param beanClass 要创建的Bean的类
     * @return 创建的Bean实例
     * @throws BeansException 如果创建Bean过程中出现错误
     */
    Object createBean(Class<?> beanClass) throws BeansException;

    /**
     * 对一个已存在的Bean实例进行自动装配
     *
     * @param existingBean 要进行自动装配的Bean实例
     * @param beanName     Bean的名称，用于按名称自动装配
     * @throws BeansException 如果自动装配过程中出现错误
     */
    void autowireBean(Object existingBean, String beanName) throws BeansException;

    /**
     * 在Bean初始化之前应用Bean后处理器
     *
     * @param existingBean 要处理的Bean实例
     * @param beanName     Bean的名称
     * @return 经过处理的Bean实例
     * @throws BeansException 如果处理过程中出现错误
     */
    Object appBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;

    /**
     * 在Bean初始化之后应用Bean后处理器
     *
     * @param existingBean 要处理的Bean实例
     * @param beanName     Bean的名称
     * @return 经过处理的Bean实例
     * @throws BeansException 如果处理过程中出现错误
     */
    Object appBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
}
